思考: XACT ABORTを使って途中でエラーになったトランザクションをロールバックする
入れ子のBEGIN TRANSACTIONの中でROLLBACKすると全体がロールバックされる
BEGIN TRANSACTION transaction_nameでトランザクションに名前を割り当てたらできそう
使ってるツールによって挙動違うとかある?
今トランザクション中だよみたいな状態ってわかる?
BEGIN TRANSACTIONで1増える
COMMITで1減る
ROLLBACKで0に
複数データINSERTしている場合成功しているものは残ってしまう
戻せないの?
ROLLBACKすれば戻せる
トランザクションの状態は続いているから
@@TRANCOUNTでわかる
1個失敗したら全部ロールバックしてほしい…
オプションである
ONにすると@@OPTIONSに+16384
16384 XACT_ABORT Transact-SQL ステートメントで実行時エラーが発生した場合、トランザクションをロールバックします。
XACT_ABORT ONのデメリットがいまいちわからない
途中までの処理までロールバックしないようにということなんだろうけど…
複数のクエリをまとめて処理する時って、「辻褄があう一連の処理」になるように作る気がする
ユーザー情報テーブルをUPDATE、次に関連するテーブルをINSERT...みたいな
開発用のDBで動かして問題がなければ、それをまるっと本番用のDBで動かす
開発用DBと本番用DBでデータにちょっと差異があって本番でコケた!
事前に検証したはずなのに!(原因は色々)
もう一回やりなおしたい!
「とりあえず失敗したところまでは反映しておいたわ」で嬉しいパターンがあんまり思いつかない
めちゃくちゃ件数が多いからとにかく成功するまで突っ込みたいとか?
↓これだと(誤ってCOMMITしたら)テーブルの状態が変わってしまわない?
トランザクション開始しました
INSERT実行しました
99件目までは成功してるんで突っ込んでます
COMMIT or ROLLBACK待ち…